/*
 * Copyright (c) 2025 粤港澳大湾区（广东）国创中心
 *
 * This file is a part of NctiCAEPre.
 *
 * NctiCAEPre is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *          http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 *
 */

#pragma once

#include <QDialog>
#include <QTreeWidget>

#include "PopupBaseDialog.h"
#include "AddLoadingDLLWidget.h"

#include <variant>
#include <nlohmann/json.hpp>
using json = nlohmann::json;

class QListView;
class QComboBox;
class QRadioButton;
class QCheckBox;
class QListWidget;
class SelectColorWidget;
class ModelColorPreviewWidget;

namespace NCTI {

/**
 * @brief Linux配置（空）
 */
struct LinuxConfig
{
    friend void to_json(json& j, const LinuxConfig&)
    {
        j = json::object(); // 空对象
    }
    friend void from_json(const json& j, LinuxConfig&)
    {
        // 空对象无需解析
    }
};

/**
 * @brief 渲染器配置类
 */
class RendererConfig
{
public:
    bool OpenRenderDisplayTime = false;  ///< 是否显示渲染时间
    bool RenderPreHighlight    = false;  ///< 是否实时高亮
    bool RenderBoxSelctAll     = false;  ///< 是否框选所有
    bool OperatingAxis = true;  ///< 是否显示操作轴

    /**
     * @brief 背景颜色数组
     * @details 包含两个颜色值，分别用于渐变背景的上下部分
     */
    std::array<std::string, 2> BackgroundColor{ "#05264f", "#515a92" };

    /**
     * @brief 对象显示模式数组
     * @details 包含三个布尔值，分别控制面、边、顶点的显示状态
     * 默认值为{true, true, false}，表示显示面和边，隐藏顶点
     */
    std::array<bool, 3> ObjectDisplayMode{ true, true, false };

    friend void to_json(json& j, const RendererConfig& config)
    {
        j = {
            {"OpenRenderDisplayTime", config.OpenRenderDisplayTime},
            {"RenderPreHighlight", config.RenderPreHighlight},
            {"RenderBoxSelctAll", config.RenderBoxSelctAll},
            {"OperatingAxis", config.OperatingAxis},
            {"BackgroundColor", config.BackgroundColor},
            {"ObjectDisplayMode", config.ObjectDisplayMode},
        };
    }
    friend void from_json(const json& j, RendererConfig& config)
    {
        if (j.contains("OpenRenderDisplayTime")) {
            j.at("OpenRenderDisplayTime").get_to(config.OpenRenderDisplayTime);
        }

        if (j.contains("RenderPreHighlight")) {
            j.at("RenderPreHighlight").get_to(config.RenderPreHighlight);
        }

        if (j.contains("RenderBoxSelctAll")) {
            j.at("RenderBoxSelctAll").get_to(config.RenderBoxSelctAll);
        }
        if (j.contains("OperatingAxis")) {
            j.at("OperatingAxis").get_to(config.OperatingAxis);
        }
        if (j.contains("BackgroundColor")) {
            j.at("BackgroundColor").get_to(config.BackgroundColor);
        }
        if (j.contains("ObjectDisplayMode")) {
            j.at("ObjectDisplayMode").get_to(config.ObjectDisplayMode);
        }
    }
};

/**
 * @brief 系统配置项
 * @details 包含渲染器配置、主题、语言、颜色设置等
 */
struct WindowsConfig
{
    bool ShowBackColor = true;   ///< 是否显示反面
    bool ShowContour = true;   ///< 是否显示轮廓
    int LineType{ 0 };  ///< 线型
    double LineWidth = 1.0;    ///< 线宽
    std::string BackColor{ "#919eba" };    ///< 发面颜色
    std::string ContourColor{ "#f5800f" }; ///< 轮廓颜色
    std::string ThemeColor{"light"};           ///< 主题颜色
    std::string Language{"chinese"};           ///< 语言
    std::string FaceColor{"#919eba"};          ///< 面颜色
    std::string EdgeColor{"#000000"};          ///< 边颜色
    std::string VertexColor{"#f8cb16"};        ///< 顶点颜色
    std::string HighlightColor{"#f5800f"};     ///< 高亮颜色
    std::string LineSegmentColor{"#ffffff"};   ///< 线段颜色
    std::string DimensionLineColor{"#1eb341"}; ///< 尺寸线颜色
    std::string GridLineColor{"#4d5d80"};      ///< 网格线颜色

    std::string AutoSaveFolder; ///< 自动保存文件夹
    int AutoSaveTime   = 300;   ///< 自动保存时间（秒），默认为300秒
    bool AutoSaveValid = true;  ///< 是否启用自动保存
    bool Console       = true;  ///< 是否显示控制台
    bool ScriptEditor  = false; ///< 是否使用脚本编辑器

    /**
     * @brief 导入路径数组
     * @details 存储模型导入时的搜索路径列表
     */
    std::vector<std::string> ImportPath{"D:/Dataexchange/brep/success",
                                        "D:/Dataexchange/step",
                                        "D:/Dataexchange/iges",
                                        "D:/Dataexchange/OCCSetup/occ/success",
                                        "D:/Dataexchange/OCCSetup/iges",
                                        "D:/Dataexchange/OCCSetup/step"};

    std::string FunctionPath{"D:/pythonExample/NctiPythonFunction"}; ///< Python函数路径
    std::string PythonPath;                                          ///< Python路径

    /**
     * @brief 加载的DLL插件列表
     * @details 支持两种格式：字符串或字符串数组
     * 默认包含多个核心插件
     */
    std::vector<std::variant<std::string, std::vector<std::string>>> LoadDLL = {
        std::vector<std::string>{"OCC", "ncti_occ_plugin.dll"},
        std::string("ncti_command.dll"),
        std::string("ncti_gmsh_plugin.dll"),
    };

    /**
     * @brief LoadDLL转换器结构体
     * @details 为std::variant类型提供自定义序列化和反序列化功能
     */
    struct LoadDLLConverter
    {
        static void to_json(json& j, const std::variant<std::string, std::vector<std::string>>& v)
        {
            if (std::holds_alternative<std::string>(v)) {
                j = std::get<std::string>(v);
            }
            else {
                j = std::get<std::vector<std::string>>(v);
            }
        }

        static void from_json(const json& j, std::variant<std::string, std::vector<std::string>>& v)
        {
            if (j.is_string()) {
                v = j.get<std::string>();
            }
            else if (j.is_array()) {
                v = j.get<std::vector<std::string>>();
            }
        }
    };

    friend void to_json(json& j, const WindowsConfig& config)
    {
        // 直接构造 JSON 对象（不需要先创建空对象）
        j = {
            {"AutoSaveFolder", config.AutoSaveFolder},
            {"AutoSaveTime", config.AutoSaveTime},
            {"AutoSaveValid", config.AutoSaveValid},
            {"Console", config.Console},
            {"DimensionLineColor", config.DimensionLineColor},
            {"EdgeColor", config.EdgeColor},
            {"FaceColor", config.FaceColor},
            {"FunctionPath", config.FunctionPath},
            {"GridLineColor", config.GridLineColor},
            {"HighlightColor", config.HighlightColor},
            {"ImportPath", config.ImportPath},
            {"Language", config.Language},
            {"LineSegmentColor", config.LineSegmentColor},
            {"PythonPath", config.PythonPath},
            {"ScriptEditor", config.ScriptEditor},
            {"ThemeColor", config.ThemeColor},
            {"VertexColor", config.VertexColor},
            {"ShowBackColor", config.ShowBackColor},
            {"ShowContour", config.ShowContour},
            {"BackColor", config.BackColor},
            {"ContourColor", config.ContourColor},
            {"LineType", config.LineType},
            {"LineWidth", config.LineWidth},
        };

        // 处理 LoadDLL 的特殊情况
        json loadDLLArray = json::array();
        for (const auto& item : config.LoadDLL) {
            json j_item;
            WindowsConfig::LoadDLLConverter::to_json(j_item, item);
            loadDLLArray.push_back(j_item);
        }
        j["LoadDLL"] = loadDLLArray;
    }

    friend void from_json(const json& j, WindowsConfig& config)
    {
        if (j.contains("BackColor")) {
            j.at("BackColor").get_to(config.BackColor);
        }

        if (j.contains("ContourColor")) {
            j.at("ContourColor").get_to(config.ContourColor);
        }

        if (j.contains("LineType")) {
            j.at("LineType").get_to(config.LineType);
        }

        if (j.contains("LineWidth")) {
            j.at("LineWidth").get_to(config.LineWidth);
        }

        if (j.contains("ShowBackColor")) {
            j.at("ShowBackColor").get_to(config.ShowBackColor);
        }

        if (j.contains("ShowContour")) {
            j.at("ShowContour").get_to(config.ShowContour);
        }
        if (j.contains("ImportPath")) {
            j.at("ImportPath").get_to(config.ImportPath);
        }

        if (j.contains("FunctionPath")) {
            j.at("FunctionPath").get_to(config.FunctionPath);
        }

        if (j.contains("PythonPath")) {
            j.at("PythonPath").get_to(config.PythonPath);
        }

        if (j.contains("AutoSaveValid")) {
            j.at("AutoSaveValid").get_to(config.AutoSaveValid);
        }
        if (j.contains("AutoSaveFolder")) {
            j.at("AutoSaveFolder").get_to(config.AutoSaveFolder);
        }
        if (j.contains("AutoSaveTime")) {
            j.at("AutoSaveTime").get_to(config.AutoSaveTime);
        }

        if (j.contains("ThemeColor")) {
            j.at("ThemeColor").get_to(config.ThemeColor);
        }

        if (j.contains("Language")) {
            j.at("Language").get_to(config.Language);
        }

        if (j.contains("FaceColor")) {
            j.at("FaceColor").get_to(config.FaceColor);
        }

        if (j.contains("EdgeColor")) {
            j.at("EdgeColor").get_to(config.EdgeColor);
        }

        if (j.contains("VertexColor")) {
            j.at("VertexColor").get_to(config.VertexColor);
        }

        if (j.contains("HighlightColor")) {
            j.at("HighlightColor").get_to(config.HighlightColor);
        }

        if (j.contains("LineSegmentColor")) {
            j.at("LineSegmentColor").get_to(config.LineSegmentColor);
        }

        if (j.contains("DimensionLineColor")) {
            j.at("DimensionLineColor").get_to(config.DimensionLineColor);
        }

        if (j.contains("GridLineColor")) {
            j.at("GridLineColor").get_to(config.GridLineColor);
        }

        if (j.contains("Console")) {
            j.at("Console").get_to(config.Console);
        }

        if (j.contains("ScriptEditor")) {
            j.at("ScriptEditor").get_to(config.ScriptEditor);
        }

        // 处理 LoadDLL 的特殊情况
        if (j.contains("LoadDLL") && j.at("LoadDLL").is_array()) {
            config.LoadDLL.clear();
            for (const auto& item : j.at("LoadDLL")) {
                std::variant<std::string, std::vector<std::string>> v;
                WindowsConfig::LoadDLLConverter::from_json(item, v);
                config.LoadDLL.push_back(v);
            }
        }
    }
};

/**
 * @brief 应用配置类
 * @details 组合Linux和Windows系统的配置
 */
class AppConfig
{
public:
    LinuxConfig Linux;       ///< Windows配置
    WindowsConfig Windows;   ///< Linux配置
    RendererConfig Renderer; ///< 渲染器配置

    friend void to_json(json& j, const AppConfig& config)
    {
        j = {
            {"Linux", config.Linux},
            {"Windows", config.Windows},
            {"Renderer", config.Renderer},
        };
    }
    friend void from_json(const json& j, AppConfig& config)
    {
        if (j.contains("Linux")) {
            j.at("Linux").get_to(config.Linux);
        }

        if (j.contains("Windows")) {
            j.at("Windows").get_to(config.Windows);
        }

        if (j.contains("Renderer")) {
            j.at("Renderer").get_to(config.Renderer);
        }
    }
};

/**
 * @brief 选项卡对话框类
 * @details 用于设置和配置各种选项的对话框，包括主题颜色、多语言、环境设置等
 */
class OptionsDlg : public PopupBaseDialog
{
    Q_OBJECT

public:
    explicit OptionsDlg(QWidget* parent = nullptr);

    ~OptionsDlg();

    /**
     * @brief 设置显示模式
     * @param face 面显示状态
     * @param edge 边显示状态
     * @param vertex 顶点显示状态
     */
    void setObjectDisplayMode(bool face, bool edge, bool vertex);

    /**
     * @brief 显示或隐藏控制台
     * @param consoleState 控制台显示状态
     */
    void setConsoleState(bool consoleState);

    /**
     * @brief 显示或隐藏脚本编辑器
     * @param scriptEditorState 脚本编辑器显示状态
     */
    void setScriptEditorState(bool scriptEditorState);

    /**
     * @brief 更新显示模式图标
     * @details 根据当前的显示模式（面、边、顶点）更新UI中的显示图标
     */
    void updateDisplayModeIcon();

    /**
     * @brief 递归删除树控件项
     * @param item 要删除的树项
     */
    void deleteItemRecursive(QTreeWidgetItem* item);

    /**
     * @brief 显示浮动标签
     * @details 在操作后显示临时提示信息
     */
    void showFloatingLabel();

    /**
     * @brief 显示颜色选择控件
     * @param color 初始颜色
     * @param pos 显示位置
     */
    void showSelectColorWidget(const QColor& color, const QPoint& pos);

    /**
     * @brief 添加应用程序目录中的插件
     * @param appDir 应用程序目录
     * @param pluginName 插件名称
     * @return 添加的树控件项指针
     */
    QTreeWidgetItem* addPluginInApplicationDir(const QString& appDir, const QString& pluginName);

    /**
     * @brief 添加外部目录中的插件
     * @param pluginName 插件名称
     * @return 添加的树控件项指针
     */
    QTreeWidgetItem* addPluginInOutsideDir(const QString& pluginName);

    /**
     * @brief 添加插件
     * @param pluginPath 插件路径
     * @param plugin 插件名称
     */
    void onAddPlugin(const QString pluginPath, const QString plugin);

    /**
     * @brief 恢复默认设置
     * @details 将所有配置恢复为默认值
     */
    void onRestoreDefault();

    /**
     * @brief 保存配置
     * @details 将当前配置保存到文件
     */
    void onSaveConfig();

    /**
     * @brief 面按钮状态改变处理
     * @details 当面按钮选中状态改变时调用
     */
    void onFaceButtonToggled();

    /**
     * @brief 边按钮状态改变处理
     * @details 当边按钮选中状态改变时调用
     */
    void onEdgeButtonToggled();

    /**
     * @brief 顶点按钮状态改变处理
     * @details 当顶点按钮选中状态改变时调用
     */
    void onVertexButtonToggled();

    /**
     * @brief 隐藏颜色选择控件
     * @details 关闭颜色选择对话框
     */
    void onHideSelectColorWidget();

    /**
     * @brief 设置按钮颜色
     * @param color 要设置的颜色
     */
    void setButtonColor(const QColor& color);

    /**
     * @brief 添加测试用例路径
     * @details 打开文件对话框让用户选择测试用例路径并添加
     */
    void onAddTestCasePathClicked();

    /**
     * @brief 删除测试用例路径
     * @details 删除当前选中的测试用例路径
     */
    void onDeleteTestCasePathClicked();

    /**
     * @brief 删除加载的插件
     * @details 删除当前选中的插件项
     */
    void onDeleteLoadingPluginsClicked();

    /**
     * @brief 开启备份功能
     * @details 启用自动备份功能
     */
    void onOpenBackups();

    /**
     * @brief 关闭备份功能
     * @details 禁用自动备份功能
     */
    void onCloseBackups();

    /**
     * @brief 设置备份路径
     * @details 打开文件对话框让用户选择备份路径
     */
    void onBackupPath();

    /**
     * @brief 设置Python脚本路径
     * @details 打开文件对话框让用户选择Python脚本路径
     */
    void onPythonScriptPathClicked();

    /**
     * @brief 设置Python解释器路径
     * @details 打开文件对话框让用户选择Python解释器路径
     */
    void onPythonPathClicked();

    /**
     * @brief 选择目录
     * @details 打开目录选择对话框并设置到指定的行编辑框
     * @param lineEdit 目标行编辑框
     */
    void selectDir(QLineEdit* lineEdit);

    /**
     * @brief 更新颜色
     * @details 根据用户选择更新颜色设置
     * @param color 新的颜色值
     */
    void onUpdateColor(const QColor& color);

    /**
     * @brief 更新背面颜色
     * @details 根据设置更新模型背面颜色
     */
    void onUpdateBackColor();

    /**
     * @brief 更新轮廓颜色
     * @details 根据设置更新模型轮廓颜色
     */
    void onUpdateContourColor();

    /**
     * @brief 在按钮下方显示颜色选择控件（通用）
     * @param button 目标按钮
     */
    void onShowColorWidgetBelowButton(QPushButton* button);

    /**
     * @brief 在按钮下方显示颜色选择控件（模型相关）
     * @param button 目标按钮
     */
    void onShowColorWidgetBelowButtonModel(QPushButton* button);

    /**
     * @brief 在按钮下方显示颜色选择控件（草图相关）
     * @param button 目标按钮
     */
    void onShowColorWidgetBelowButtonSketch(QPushButton* button);

    /**
     * @brief 在按钮下方显示颜色选择控件（渲染相关）
     * @param button 目标按钮
     */
    void onShowColorWidgetBelowButton_Render(QPushButton* button);

private:
    /**
     * @brief 初始化界面
     * @details 创建并设置UI布局和控件
     */
    void setupUI();

    void CreateItemListView();
    void CreateDefaultBtn();
    void CreateSaveBtn();
    QPushButton* CreateColorBtn(const QString& objName);

    /**
     * @brief 初始化控件
     * @details 创建并配置UI控件
     */
    void initWidgets();

    void initColorConnections();

    void initPathConnections();

    void initPluginConnections();

    void initBackupConnections();

    /**
     * @brief 初始化信号连接
     * @details 设置控件之间的信号和槽连接
     */
    void initConnects();

    /**
     * @brief 初始化应用配置
     * @param useDefault 是否使用默认配置，默认为false
     */
    void initAppConfig(bool useDefault = false);

    /**
     * @brief 初始化插件列表
     * @param config 应用配置对象
     */
    void initPlugins(const AppConfig& config);

    /**
     * @brief 获取插件数据
     * @param config 应用配置对象引用，用于存储插件数据
     */
    void getPluginsData(AppConfig& config) const;

    /**
     * @brief 设置颜色按钮样式表
     * @param button 目标按钮
     * @param color 要设置的颜色
     */
    void setColorButtonStyleSheet(QPushButton* button, const QColor& color);

    /**
     * @brief 更新背景颜色
     * @details 根据当前设置更新背景渐变颜色
     */
    void updateBackgroundColor();

    /**
     * @brief 设置预览模型控件颜色
     * @param button 目标按钮
     * @param color 要设置的颜色
     */
    void setPreviewModelWidgetColor(QPushButton* button, const QColor& color);

    /**
     * @brief 写入JSON文件
     * @param jsonPath 文件路径
     * @param appConfig 应用配置对象
     * @return 是否成功写入
     */
    bool writeJsonFile(const QString& jsonPath, const AppConfig& appConfig);

    /**
     * @brief 更新应用配置JSON
     * @details 将当前UI设置保存到配置JSON文件
     */
    void updateAppConfigJson();

    /**
     * @brief 更新颜色选择控件
     * @param color 要设置的颜色
     */
    void updateSelectColorWidget(const QColor& color);

    /**
     * @brief 添加加载插件点击处理
     * @details 处理添加插件按钮点击事件，打开添加插件对话框
     */
    void onAddLoadingPluginsClicked();

    /**
     * @brief 浮动标签槽函数
     * @details 处理浮动标签的显示逻辑
     */
    void onFloatingLabel();

    QWidget* CreateThemeColorWidget11();

    /**
     * @brief 创建主题颜色控件
     */
    QWidget* CreateThemeColorWidget();

    /**
     * @brief 创建多语言控件
     */
    QWidget* CreateMultilingualWidget();

    /**
     * @brief 创建CAD环境设置控件
     */
    QWidget* CreateCADEnvironmentSettingsWidget();

    /**
     * @brief 创建颜色设置控件
     */
    QWidget* CreateColorSettingWidget();

    /**
     * @brief 创建模式和光照设置控件
     */
    QWidget* CreateModeAndLightingSettingWidget();

    /**
     * @brief 创建草图绘制和操作轴设置控件
     */
    QWidget* SketchDrawingAndModeAxiseSettingWidget();

    QWidget* CreatePathSettingsWidget11();

    /**
     * @brief 创建路径设置控件
     */
    QWidget* CreatePathSettingsWidget();

    /**
     * @brief 创建加载插件控件
     */
    QWidget* CreateLoadingPluginsWidget();

    /**
     * @brief 创建窗口控件
     */
    QWidget* CreateWindowWidget();

    /**
     * @brief 创建备份控件
     */
    QWidget* CreateBackupsWidget();

protected:
    /**
     * @brief 事件过滤器
     * @param obj 对象指针
     * @param event 事件指针
     * @return 是否处理事件
     */
    bool eventFilter(QObject* obj, QEvent* event) override;

Q_SIGNALS:
    /**
     * @brief 保存按钮点击信号
     */
    void savePushButtonClicked();

private:
    QListView* itemListView{nullptr};       ///< 选项列表视图指针
    QPushButton* defaultBtn{nullptr};       ///< 恢复默认按钮指针
    QPushButton* saveBtn{nullptr};          ///< 保存配置按钮指针
    QLabel* floatingLabel{nullptr};         ///< 浮动标签指针
    QComboBox* themeColorComboBox{nullptr}; ///< 主题颜色组合框指针
    QComboBox* languageComboBox{nullptr};   ///< 多语言组合框指针

    // 环境设置相关控件
    QPushButton* topColorBtn{nullptr};           ///< 顶部颜色按钮指针
    QPushButton* bottomColorBtn{nullptr};        ///< 底部颜色按钮指针
    QPushButton* faceColorBtn{nullptr};          ///< 面颜色按钮指针
    QPushButton* edgeColorBtn{nullptr};          ///< 边颜色按钮指针
    QPushButton* vertexColorBtn{nullptr};        ///< 顶点颜色按钮指针

    QPushButton* highLightColorBtn{nullptr};     ///< 高亮颜色按钮指针
    QPushButton* lineSegmentColorBtn{nullptr};   ///< 线段颜色按钮指针
    QPushButton* dimensionLineColorBtn{nullptr}; ///< 尺寸线颜色按钮指针
    QPushButton* gridLineColorBtn{nullptr};      ///< 网格线颜色按钮指针

    QLineEdit* backgroundGradientColorLabel{nullptr};          ///< 背景渐变颜色标签指针
    ModelColorPreviewWidget* modelColorPreviewWidget{nullptr}; ///< 模型颜色预览控件指针
    SelectColorWidget* colorWidget{nullptr};                   ///< 颜色选择控件指针
    bool colorWidgetVisible{false};                            ///< 颜色控件是否可见

    QPushButton* currentActiveBtn{nullptr}; ///< 当前活动按钮指针

    QPushButton* faceBtn{nullptr};    ///< 面按钮指针
    QPushButton* edgeBtn{nullptr};    ///< 边按钮指针
    QPushButton* vertexBtn{nullptr};  ///< 顶点按钮指针
    QLabel* faceIconLabel{nullptr};   ///< 面图标标签指针
    QLabel* edgeIconLabel{nullptr};   ///< 边图标标签指针
    QLabel* vertexIconLabel{nullptr}; ///< 顶点图标标签指针

    QRadioButton* displayOperatingAxiseBtn{nullptr}; ///< 显示操作轴单选按钮指针
    QRadioButton* hideOperatingAxiseBtn{nullptr};    ///< 隐藏操作轴单选按钮指针

    QRadioButton* highlightBtn{nullptr};
    QRadioButton* hideHighlightBtn{nullptr};

    QRadioButton* selectAllBtn{nullptr};
    QRadioButton* hideSelectAllBtn{nullptr};

    // 渲染设置相关
    QComboBox* lineTypeComBox{nullptr};                    ///< 线类型组合框指针
    QLineEdit* lineWidthLineEdit{nullptr};                 ///< 线宽度行编辑框指针
    QCheckBox* modelFaceCheckBox{nullptr};                 ///< 模型面复选框指针
    QCheckBox* highlightContourCheckBox{nullptr};          ///< 高亮轮廓复选框指针
    QPushButton* backFaceColorSettingBtn{nullptr};         ///< 背面颜色设置按钮指针
    QPushButton* highlightContourColorSettingBtn{nullptr}; ///< 高亮轮廓颜色设置按钮指针
    QRadioButton* displayFrameRateButton{nullptr};         ///< 显示帧率单选按钮指针
    QRadioButton* hideFrameRateButton{nullptr};            ///< 隐藏帧率单选按钮指针

    //路径设置
    QListWidget* testCasePathListWidget{nullptr}; ///< 测试用例路径列表控件指针
    QPushButton* addTestCasePathBtn{nullptr};     ///< 浏览添加测试用例路径按钮指针
    QPushButton* deleteTestCasePathBtn{nullptr};  ///< 浏览删除测试用例路径按钮指针
    QLineEdit* pythonScriptPathLineEdit{nullptr}; ///< Python脚本路径行编辑框指针
    QPushButton* pythonScriptPathButton{nullptr}; ///< 浏览Python脚本路径按钮指针
    QLineEdit* pythonPathLineEdit{nullptr};       ///< Python路径行编辑框指针
    QPushButton* pythonPathButton{nullptr};       ///< 浏览Python路径按钮指针

    //加载插件
    QTreeWidget* treeWidget{nullptr};             ///< 树控件指针
    QPushButton* addLoadingPluginBtn{nullptr};    ///< 浏览添加加载插件按钮指针
    QPushButton* deleteLoadingPluginBtn{nullptr}; ///< 浏览删除加载插件按钮指针
    AddLoadingDLLWidget* addDLLWidget{nullptr};   ///< 添加DLL控件指针

    //窗口
    QRadioButton* displayConsoleButton{nullptr};      ///< 显示控制台单选按钮指针
    QRadioButton* hideConsoleButton{nullptr};         ///< 隐藏控制台单选按钮指针
    QRadioButton* displayScriptEditorButton{nullptr}; ///< 显示脚本编辑器单选按钮指针
    QRadioButton* hideScriptEditorButton{nullptr};    ///< 隐藏脚本编辑器单选按钮指针

    //备份
    QRadioButton* openBackupsButton{nullptr};  ///< 打开备份单选按钮指针
    QRadioButton* closeBackupsButton{nullptr}; ///< 关闭备份单选按钮指针
    QLineEdit* timeLineEdit{nullptr};          ///< 时间行编辑框指针
    QLineEdit* backupPathLineEdit{nullptr};    ///< 备份路径行编辑框指针
    QPushButton* backupPathBtn{nullptr};       ///< 浏览备份路径按钮指针

    /**
     * @brief 显示模式数组
     * @details 存储面、边、顶点的显示状态，索引0=面，1=边，2=顶点
     */
    std::array<bool, 3> displayMode{true, true, false};

    AppConfig mAppConfig;
};
} // namespace NCTI